package com.bizframework.core.domain;

import java.io.Serializable;
import java.util.List;

/**
 * Dao基本接口
 * 
 * @author liujiamin
 * 
 * @param <T>
 *            Dao操作的实体类型
 * @param <IDT>
 *            Dao所操作的实体的Id类型。
 */
public interface BaseDao<T extends BaseEntity<IDT>, IDT extends Serializable> {
	/**
	 * 删除实体
	 * 
	 * @param entity
	 *            需要删除的实体
	 * @throws Exception
	 */
	public void delete(T entity) throws Exception;

	/**
	 * 查找实体列表
	 * 
	 * @param name
	 *            实体属性名
	 * @param value
	 *            实体属性值
	 * @return 符合条件的实体列表
	 * @throws Exception
	 */
	public List<T> findBy(String name, Object value) throws Exception;

	/**
	 * 查找实体列表
	 * 
	 * @param names
	 *            实体属性名列表
	 * @param values
	 *            实体属性值列表
	 * @return 符合条件的实体列表
	 * @throws Exception
	 */
	public List<T> findBy(String[] names, Object[] values) throws Exception;

	/**
	 * 执行语句。
	 * 
	 * @throws Exception
	 */
	public void flush() throws Exception;

	/**
	 * 获取所有实体
	 * 
	 * @return 所有实体列表
	 * @throws Exception
	 */
	public List<T> getAll() throws Exception;

	/**
	 * 通过设置查询条件，获取实体列表。 可以设置开始行数、返回数据条数以及排序字段。
	 * 本函数不返回符合条件的记录总数（在大数据量时候提高查询性能，总数可以通过另外的方式来保存和获取）。
	 * 
	 * @param conditions
	 *            查询条件列表
	 * @param startIndex
	 *            开始行数
	 * @param count
	 *            返回记录数
	 * @param sortInfo
	 *            排序信息
	 * @return 符合条件的实体列表（记录数<=count）
	 * @throws Exception
	 */
	public List<T> getByConditions(List<QueryCondition> conditions,
			int startIndex, int count, SortInfo sortInfo) throws Exception;

	/**
	 * 通过设置查询条件，获取符合条件的所有实体列表。 可以设置排序字段。
	 * 
	 * @param conditions
	 *            查询条件列表
	 * @param sortInfo
	 *            排序信息
	 * @return 符合条件的所有实体列表
	 * @throws Exception
	 */
	public List<T> getByConditions(List<QueryCondition> conditions,
			SortInfo sortInfo) throws Exception;

	/**
	 * 通过设置查询条件，获取实体列表。 可以设置开始行数、返回数据条数以及排序字段。
	 * 本函数返回ListResult类型的列表，ListResult的totalCount属性是符合条件的记录总数。
	 * 
	 * @param conditions
	 * @param startIndex
	 * @param count
	 * @param sortInfo
	 * @return 返回符合条件的对象
	 * @throws Exception
	 */
	public ListResult<T> getByConditionsWithCount(
			List<QueryCondition> conditions, int startIndex, int count,
			SortInfo sortInfo) throws Exception;

	/**
	 * 获取
	 * 
	 * @param conditions
	 * @return
	 * @throws Exception
	 */
	public int getCountByConditions(List<QueryCondition> conditions)
			throws Exception;

	/**
	 * 通过标识获取实体
	 * 
	 * @param entityId
	 *            实体标识
	 * @return 返回符合条件的实体
	 * @throws Exception
	 */
	public T getById(IDT entityId) throws Exception;

	/**
	 * 刷新实体
	 * 
	 * @param entity
	 *            需要刷新的实体
	 * @throws Exception
	 */
	public void refresh(T entity) throws Exception;

	/**
	 * 保存实体，本方法是在数据库增加一条实体记录。
	 * 
	 * @param entity
	 *            需要保存的实体
	 * @throws Exception
	 */
	public void save(T entity) throws Exception;

	/**
	 * 保存或更新实体。
	 * 
	 * @param entity
	 *            需要保存或更新的实体。
	 * @throws Exception
	 */
	public void saveOrUpdate(T entity) throws Exception;

	/**
	 * 更新实体
	 * 
	 * @param entity
	 *            需要更新的实体。
	 * @throws Exception
	 */
	public void update(T entity) throws Exception;

	/**
	 * 整合实体
	 * 
	 * @param entity
	 *            需要整合的实体。
	 * @throws Exception
	 */
	public T merge(T entity);
}
